/* 
1.监听 GET 请求
   通过 app.get() 方法，可以监听客户端的 GET 请求
   语法：
       app.get('请求URL',function(req,res)){
       });  
        
       参数1：客户端的请求 URL 地址
       参数2：请求对应的处理函数
              req: 请求对象(包含了与请求相关的属性和方法)
              res: 响应对象(包含了与响应相关的属性和方法)

              本质都是对 http 协议的封装

2.监听 POST 请求
   通过 app.post() 方法，可以监听客户端的 POST 请求
   语法：
       app.post('请求URL',function(req,res)){
         // 处理函数
       });
       参数1：客户端的请求 URL 地址
       参数2：请求对应的处理函数
              req: 请求对象(包含了与请求相关的属性和方法)
              res: 响应对象(包含了与响应相关的属性和方法)
              
              本质都是对 http 协议的封装              

3.把内容响应给客户端
     通过 res.send() 方法，把处理好的内容发送给客户端
     语法：
         app.get('/user',(req,res) => {
            // 向客户端发送 JSON 对象
            res.send({name:'张三',age:22,sex:'男'});
         });

         app.get('/user',(req,res) => {
            // 向客户端发送 文本内容
            res.send('success');
         });  
*/
// 导入 expres 模块
const express = require("express");

// 创建 express 的服务器实例
const app = express();

// 1. get 请求
app.get("/user", (req, res) => {
  let hero = {
    name: "剑圣",
    age: 22,
    skill: "剑圣风暴",
    level: 30,
  };
  res.send(hero);
});
// {"name":"剑圣","age":22,"skill":"剑圣风暴","level":30}

// 2. post 请求测试
app.post("/user", (req, res) => {
  res.send("success");
});

/* 
  get请求：
    1.传递参数：url?key=value&key=value&key=value
      例如：http://localhost:8080/hero?id=123&age=22&sex=true
    2.浏览器发起的时GET请求
    3.url的长度有限制
    4.post也可以通过body传参 
*/

/* 
  restful:
    1.GET用来获取资源
    2.POST用来新建资源（也可以用来更新资源）
    3.PUT用来更新资源
    4.DELETE用来删除资源
*/


/* 
4.获取 url 中携带的查询参数
    通过 req.query 对象，可以访问到客户端通过查询字符串的形式，发送到服务器的参数
    语法：
        app.get('/user',(req,res) => {
            // req.query 默认是一个空对象
            // 客户端使用 ?name=zs&age=20 查询字符串形式，发送到服务器的参数
            // 可以通过 req.query 对象访问到，例如：
            // req.query.name  req.query.age
            console.log(req.query);
         });
*/
// 路径传参
// http://localhost:8080/hero?id=123&age=22&sex=true
app.get("/hero", (req, res) => {
  let query = req.query;  // 默认是一个空对象
  console.log(query);     // { id: '123', age: '22', sex: 'true' }
  console.log(query.id);  // 123
  res.send(query);      // 返回给浏览器
});

/* 
5.获取 URL 中动态参数
   通过 req.params 对象，可以访问到 URL 中，通过 : 匹配到的动态参数
   app.get('/user/:id', (req, res) => {
       // req.params 默认是一个空对象
       // 里面存放着 :id (占位符) 匹配到动态参数值
      //  id 是 key 
       console.log(req.params);
   });
*/
// 动态传参(占位符)
// http://localhost:8080/list/25/coco
app.get("/list/:id/:name", (req, res) => {
  let params = req.params;
  console.log(params);        // { id: '25', name: 'coco' }
  console.log(params.name);   // coco
  res.send(params);           // 返回给浏览器
});

/* 
  res.end只能支持两种参数，要么字符串，要么Buffer缓冲区
  res.send可以支持多种参数,比如可以传json对象,Buffer,String,Array
 */

// 指定端口号，并启动服务
app.listen(8080, () => {
  console.log("服务已启动, 127.0.0.1:8080");
});